//
//  GameAlgorithm.h
//  EatNumber
//
//  Created by zg.shao on 14/12/20.
//  Copyright (c) 2014年 kuwo.cn. All rights reserved.
//

#ifndef EatNumber_GameAlgorithm_h
#define EatNumber_GameAlgorithm_h

#define GAME_ROW_MAX    6
#define GAME_COL_MAX    5

#define GAME_CELL_MAX   (GAME_ROW_MAX * GAME_COL_MAX)

// 根据数组的索引，获取行和列的索引
#define GET_ROW_INDEX(index) ((index) / GAME_COL_MAX)
#define GET_COL_INDEX(index) ((index) % GAME_COL_MAX)

// 根据行和列，获取数组的索引
#define GET_INDEX(row, col)  ((row) * GAME_COL_MAX + col)

/*
 * 游戏规则：
 *      1、选中一个cell，向上下左右四个方向移动，当到达边界的时候不能移动；
 *      2、X向Y移动，满足这几个条件的时候可以移动：（Y==-1 && X > 0 && X < GameCellValue_30）|| (X>=0 && Y - 1 == X)
 *      3、当X向Y移动，（Y==-1 && X > 0 && X < GameCellValue_30） Y 的值是X-2；(X>=0 && Y - 1 == X) Y 的值是X+1
 *      4、当棋盘上面仅仅有一个数字的时候，胜利了； 当没有移动的数字并且有多个0的时候，失败了！
 */
typedef enum GameCellValue {
    GameCellValue_Blank = -1, // 表示空着的块
    GameCellValue_0 = 0,   // 黑色的 0 块
    GameCellValue_1,
    GameCellValue_2,
    GameCellValue_3,
    GameCellValue_4,
    GameCellValue_5,
    GameCellValue_6,
    GameCellValue_7,
    GameCellValue_8,
    GameCellValue_9,
    GameCellValue_10,
    GameCellValue_11,
    GameCellValue_12,
    GameCellValue_13,
    GameCellValue_14,
    GameCellValue_15,
    GameCellValue_16,
    GameCellValue_17,
    GameCellValue_18,
    GameCellValue_19,
    GameCellValue_20,
    GameCellValue_21,
    GameCellValue_22,
    GameCellValue_23,
    GameCellValue_24,
    GameCellValue_25,
    GameCellValue_26,
    GameCellValue_27,
    GameCellValue_28,
    GameCellValue_29,
//    GameCellValue_30,
    
    GameCellValue_Wall = 24678 // 永远合并不了的，表示障碍物
} GameCellValue;

// 游戏的进度，刚刚开始、进行中、胜利和输了
typedef enum GameProgress {
    GameProgress_New,       // 新一局
    GameProgress_InPlaying, // 在玩的当中
    GameProgress_PlayerFail,// 玩家输了
    GameProgress_PlayerWin, // 玩家胜利
    GameProgress_AllFinished, // 全部通关了
    
    GameProgress_Max
} GameProgress;

typedef NS_ENUM(NSInteger, ArrowDirection) {
    ArrowDirectionUp,
    ArrowDirectionDown,
    ArrowDirectionLeft,
    ArrowDirectionRight
};
#endif
